﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// NotReviewedButNeeded
#pragma once
#include "GcmpDatabase.h"
#include "GbmpTypeDefs.h"
#include <string>
#include <cstdint>
#include <functional>

namespace gcmp
{
    // \brief Ndb数据类型
    //
    // 标*的是非叶子节点，不建议程序员直接读取值. 
    // 部分类型，比如NdbPropertySchemaType::Value, NdbPropertySchemaType::ElementId有visual type(EnIntOrFloat)，一般程序员不用关心。
    // 框架修改者添加新的NdbPropertySchemaType::Value类型时，需要使用DEFINE_VISUAL_TYPE_XXX宏定义visual type。
    // 具体例子参见NdbTypeTraits.h中property_is_value_type中已有的类型。
    enum class NdbPropertySchemaType : int8_t
    {
        Invalid = 0,        ///< 非法类型
        Value,              ///< 可以直接内存拷贝的类型
        ElementId,          ///< ElementId
        WString,            ///< std::wstring
        SchematicObject,    ///< * 继承于NdbObjectSchematic的类型
        CloneableObject,    ///< * 继承于NdbObjectCloneable的类型
        IDbObject,          ///< * 继承于IDbObject的类型
        NativePointer,      ///< 裸指针，只支持IElement*和IDocument*
        OwnerPtrToNdbObject,///< * 指向NdbObject派生类的OwnerPtr
        OwnerPtrToIDbObject,///< * 指向IDbObject派生类的OwnerPtr
        Vector,             ///< * NdbVector
        Set,                ///< * NdbSet
        Map,                ///< * NdbMap
        UnorderedMap,       ///< * NdbUnorderedMap
    };

    // 行为类型
    enum EnPropertyBehaviourType
    {
        PBT_Transient = 0x000,
        PBT_SupportCopy = 0x001,
        PBT_SupportTransaction = 0x010,
        PBT_SupportArchive = 0x100,
        PBT_SupportAll = 0x111
    };

    /// \brief 【内部使用】Ndb属性工具
    class GCMP_DATABASE_EXPORT NdbPropertyUtils
    {
    public:
        static std::wstring ValueAsWString(
            const char * pData,
            UInt64 byteSizes,
            IntOrFloatType intOrFloatType,
            IntBaseType intBaseType,
            const wchar_t * const pSplitWString
        );

        static const std::wstring& SchemaTypeAsWString(NdbPropertySchemaType schemaType);

        static std::wstring VisualTypeAsWString(IntOrFloatType visualType);

        // 属性不一定按照其声明的行为工作，需要改编属性的行为。
        // 下面定义了几种默认的Adapter。
    public:
        typedef std::function<Int32(Int32)> BehavioursAdapter;

        // 属性行为改编：不变，行为和声明保持一致。
        static Int32 PropertyBehaveAsDeclaration(Int32 behaviours);

        // 属性行为改编：即使声明为不支持Archive，但只要声明为支持Transaction，则Archive。
        static Int32 ArchivePropertyForTransaction(Int32 behaviours);

        // 属性行为改编：即使声明为Transient，也Archive
        static Int32 ArchiveTransientProperty(Int32 behaviours);
    };
}
